<template>
  <div class="depart-list">
    <a-row :gutter="12" class="aRow-wrapper">
      <a-col :span="24" class="listContent-wrapper">
        <div class="l-w_content">
          <top-title :content="content" :updateTime="true"></top-title>
          <div class="l-w_c_content">
            <div class="departlist">
              <a-row :gutter="10" style="height: 100%">
                <a-col :md="12" :sm="24" style="height: 100%">
                  <a-card :bordered="false" class="sys-depart-card" style="height: 100%">
                    <!-- 按钮操作区域 -->
                    <a-row style="margin-left: 14px">
                      <a-button class="searchBtn" type="primary" @click="handleAdd(2)">添加下级</a-button>
                      <a-button class="searchBtn" icon="download" type="primary" @click="handleExportXls('区域信息')">
                        导出
                      </a-button>
                      <a-upload
                        :action="importExcelUrl"
                        :headers="tokenHeader"
                        :multiple="false"
                        :showUploadList="false"
                        accept=".xls,.xlsx,"
                        name="file"
                        @change="handleImportExcel"
                      >
                        <a-button class="searchBtn" icon="import" type="primary">导入</a-button>
                      </a-upload>
                      <a-button class="searchBtn" title="删除多条数据" type="default" @click="batchDel">
                        批量删除
                      </a-button>
                    </a-row>
                    <div style="padding-left: 16px; height: 100%; margin-top: 5px">
                      <a-alert :showIcon="true" type="info">
                        <div slot="message">
                          当前选择：<span v-if="this.currSelected.title">{{ getCurrSelectedTitle() }}</span>
                          <a
                            v-if="this.currSelected.title"
                            style="margin-left: 10px; color: #04dce8"
                            @click="onClearSelected"
                          >
                            取消选择
                          </a>
                        </div>
                      </a-alert>
                      <a-input-search
                        class="input-search"
                        placeholder="请输入区域名称"
                        style="width: 100%; margin-top: 10px"
                        @search="onSearch"
                      />
                      <!-- 树-->
                      <a-col :md="24" :sm="24">
                        <template>
                          <a-dropdown :trigger="[this.dropTrigger]" @visibleChange="dropStatus">
                            <span style="user-select: none">
                              <div id="treeList" class="tree-x" style="height: 100%; overflow: scroll">
                                <a-tree
                                  :autoExpandParent="autoExpandParent"
                                  :checkStrictly="checkStrictly"
                                  :checkedKeys="checkedKeys"
                                  :defaultExpandAll="false"
                                  :expandedKeys="iExpandedKeys"
                                  :loading="loading"
                                  :selectedKeys="selectedKeys"
                                  :treeData="departTree"
                                  checkable
                                  multiple
                                  @check="onCheck"
                                  @expand="onExpand"
                                  @rightClick="rightHandle"
                                  @select="onSelect"
                                />
                              </div>
                            </span>
                            <!--新增右键点击事件,和增加添加和删除功能-->
                            <a-menu slot="overlay">
                              <a-menu-item key="1" @click="handleAdd(3)">添加</a-menu-item>
                              <a-menu-item key="2" @click="handleDelete">删除</a-menu-item>
                              <a-menu-item key="3" @click="closeDrop">取消</a-menu-item>
                            </a-menu>
                          </a-dropdown>
                        </template>
                      </a-col>
                    </div>
                  </a-card>
                  <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
                  <div class="drawer-bootom-button">
                    <a-dropdown :trigger="['click']" placement="topCenter">
                      <a-menu slot="overlay" class="much">
                        <a-menu-item key="1" @click="switchCheckStrictly(1)">父子关联</a-menu-item>
                        <a-menu-item key="2" @click="switchCheckStrictly(2)">取消关联</a-menu-item>
                        <a-menu-item key="3" @click="checkALL">全部勾选</a-menu-item>
                        <a-menu-item key="4" @click="cancelCheckALL">取消全选</a-menu-item>
                        <a-menu-item key="5" @click="expandAll">展开所有</a-menu-item>
                        <a-menu-item key="6" @click="closeAll">合并所有</a-menu-item>
                      </a-menu>
                      <a-button class="searchBtn"> 树操作 <a-icon type="up" /> </a-button>
                    </a-dropdown>
                  </div>
                  <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
                </a-col>
                <a-col :md="12" :sm="24">
                  <a-card v-if="selectedKeys.length > 0" :bordered="false" class="right-form-wrapper">
                    <a-form :form="form" autocomplete="off">
                      <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="区域名称">
                        <a-input
                          v-decorator="['departName', validatorRules.departName]"
                          :maxLength="30"
                          placeholder="请输入机构/区域名称"
                        />
                      </a-form-item>
                      <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="国家编码">
                        <a-input
                          v-decorator="['orgCode', validatorRules.orgCode]"
                          :maxLength="30"
                          disabled
                          placeholder="请输入国家编码"
                        />
                      </a-form-item>
                      <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="上级区域">
                        <a-tree-select
                          v-model="model.parentId"
                          :disabled="disable"
                          :dropdownStyle="{ maxHeight: '200px', overflow: 'auto' }"
                          :treeData="treeData"
                          placeholder="无"
                          style="width: 100%"
                        >
                        </a-tree-select>
                      </a-form-item>
                      <a-form-item
                        :labelCol="labelCol"
                        :wrapperCol="wrapperCol"
                        class="area-right-padding"
                        label="经度"
                      >
                        <a-input v-decorator="['lng', validatorRules.lng]" placeholder="请输入经度" />
                        <img class="select-map-img" src="@/assets/imgs/in-map.png" @click="showMap" />
                      </a-form-item>
                      <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="纬度">
                        <a-input v-decorator="['lat', validatorRules.lat]" placeholder="请输入纬度" />
                      </a-form-item>
                      <a-form-item
                        :labelCol="labelCol"
                        :wrapperCol="wrapperCol"
                        class="area-right-padding"
                        label="区域边界坐标"
                      >
                        <a-input
                          v-decorator="['areaPosition', validatorRules.areaPosition]"
                          placeholder="例：lat:104.123456,lng:34.78908"
                        />
                        <img class="select-map-img" src="@/assets/imgs/map-area.png" @click="createBorderLine" />
                      </a-form-item>
                      <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="排序">
                        <a-input-number v-decorator="['departOrder', { initialValue: 0 }]" />
                      </a-form-item>
                      <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="区域简介">
                        <a-input
                          v-decorator="['description', validatorRules.description]"
                          :maxLength="30"
                          placeholder="请输入区域简介"
                        />
                      </a-form-item>
                      <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="备注">
                        <a-input
                          v-decorator="['memo', { initialValue: '' }]"
                          :maxLength="30"
                          placeholder="请输入备注"
                        />
                      </a-form-item>
                    </a-form>
                    <div class="anty-form-btn">
                      <a-button class="resetBtn" htmlType="button" icon="sync" type="primary" @click="emptyCurrForm">
                        重置
                      </a-button>
                      <a-button class="searchBtn" htmlType="button" icon="form" type="primary" @click="submitCurrForm">
                        保存
                      </a-button>
                    </div>
                  </a-card>
                  <a-card v-else :bordered="false">
                    <a-empty>
                      <span slot="description"> 请先选择一个区域! </span>
                    </a-empty>
                  </a-card>
                </a-col>
                <depart-modal ref="departModal" @ok="loadTree"></depart-modal>
              </a-row>
            </div>
          </div>
        </div>
      </a-col>
    </a-row>
    <a-map ref="aMap" :visible.sync="isShowMap" @border="getBorder" @getLatLong="getLatLong"></a-map>
  </div>
</template>
<script>
import topTitle from '@/components/topTitle'
// import DepartModal from './modules/DepartModal'
import pick from 'lodash.pick'
// import { queryDepartTreeList, searchByKeywords, deleteByDepartId } from '@/api/api'
import { httpAction, deleteAction } from '@/api/manage'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import AMap from '@/components/a-map/index.vue'

// 表头
const columns = [
  {
    title: '机构名称',
    ellipsis: true,
    dataIndex: 'departName',
  },
  {
    title: '机构类型',
    align: 'center',
    ellipsis: true,
    dataIndex: 'orgType',
  },
  {
    title: '机构编码',
    ellipsis: true,
    dataIndex: 'orgCode',
  },
  {
    title: '手机号',
    ellipsis: true,
    dataIndex: 'mobile',
  },
  {
    title: '传真',
    ellipsis: true,
    dataIndex: 'fax',
  },
  {
    title: '地址',
    ellipsis: true,
    dataIndex: 'address',
  },
  {
    title: '排序',
    ellipsis: true,
    align: 'center',
    dataIndex: 'departOrder',
  },
  {
    title: '操作',
    align: 'center',
    dataIndex: 'action',
    scopedSlots: { customRender: 'action' },
  },
]
export default {
  name: 'DepartList',
  mixins: [JeecgListMixin],
  components: {
    DepartModal,
    AMap,
    topTitle,
  },
  data() {
    return {
      content: [['机关管理']],
      iExpandedKeys: [],
      loading: false,
      autoExpandParent: true,
      currFlowId: '',
      currFlowName: '',
      disable: true,
      treeData: [],
      visible: false,
      departTree: [],
      rightClickSelectedKey: '',
      rightClickSelectedOrgCode: '',
      rightClickSelectedOrgType: '',
      hiding: true,
      model: {},
      dropTrigger: '',
      depart: {},
      columns: columns,
      disableSubmit: false,
      checkedKeys: [],
      selectedKeys: [],
      autoIncr: 1,
      currSelected: {},

      allTreeKeys: [],
      checkStrictly: true,

      form: this.$form.createForm(this),
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 },
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 },
      },
      graphDatasource: {
        nodes: [],
        edges: [],
      },
      validatorRules: {
        departName: { rules: [{ required: true, message: '请输入区域名称!' }] },
        lat: { rules: [{ required: true, message: '请输入纬度!' }] },
        lng: { rules: [{ required: true, message: '请输入经度!' }] },
        nationCode: { rules: [{ required: true, message: '请输入区域国家编码!' }] },
        areaPosition: { rules: [{ required: true, message: '请输入区域边界坐标!' }] },
      },
      url: {
        delete: '/sys/sysDepart/delete',
        edit: '/sys/sysDepart/edit',
        deleteBatch: '/sys/sysDepart/deleteBatch',
        exportXlsUrl: 'sys/sysDepart/exportXls',
        importExcelUrl: '/sys/sysDepart/importExcel',
      },
      orgCategoryDisabled: false,
      isShowMap: false,
    }
  },
  computed: {
    importExcelUrl: function () {
      return process.env.VUE_APP_BASE_API + `${this.url.importExcelUrl}`
    },
  },
  methods: {
    loadData() {
      this.refresh()
    },
    loadTree() {
      var that = this

      queryDepartTreeList().then((res) => {
        that.treeData = []
        that.departTree = []
        if (res.code == 200) {
          //区域全选后，再添加区域，选中数量增多
          this.allTreeKeys = []
          for (let i = 0; i < res.result.length; i++) {
            let temp = res.result[i]
            that.treeData.push(temp)

            that.departTree.push(temp)

            that.setThisExpandedKeys(temp)
            that.getAllKeys(temp)
            // console.log(temp.id)
          }
          this.loading = false
        }
      })
    },
    setThisExpandedKeys(node) {
      if (node.children && node.children.length > 0) {
        // this.iExpandedKeys.push(node.key)
        for (let a = 0; a < node.children.length; a++) {
          this.setThisExpandedKeys(node.children[a])
        }
      }
    },
    refresh() {
      this.loading = true
      this.loadTree()
    },
    // 右键操作方法
    rightHandle(node) {
      this.dropTrigger = 'contextmenu'
      this.rightClickSelectedKey = node.node.eventKey
      this.rightClickSelectedOrgCode = node.node.dataRef.orgCode
      this.rightClickSelectedOrgType = node.node.dataRef.orgType
    },
    onExpand(expandedKeys) {
      console.log('onExpand', expandedKeys)
      // if not set autoExpandParent to false, if children expanded, parent can not collapse.
      // or, you can remove all expanded children keys.
      this.iExpandedKeys = expandedKeys
      this.autoExpandParent = false
    },
    backFlowList() {
      this.$router.back(-1)
    },
    // 右键点击下拉框改变事件
    dropStatus(visible) {
      if (visible == false) {
        this.dropTrigger = ''
      }
    },
    // 右键店家下拉关闭下拉框
    closeDrop() {
      this.dropTrigger = ''
    },
    addRootNode() {
      this.$refs.nodeModal.add(this.currFlowId, '')
    },
    batchDel: function () {
      console.log(this.checkedKeys)
      if (this.checkedKeys.length <= 0) {
        this.$message.warning('请选择一条记录！')
      } else {
        var ids = ''
        for (var a = 0; a < this.checkedKeys.length; a++) {
          ids += this.checkedKeys[a] + ','
        }
        var that = this
        this.$confirm({
          title: '确认删除',
          content: '确定要删除所选中的 ' + this.checkedKeys.length + ' 条数据，以及子节点数据吗?',
          onOk: function () {
            deleteAction(that.url.deleteBatch, { ids: ids }).then((res) => {
              if (res.success) {
                that.$message.success(res.message)
                that.loadTree()
                that.onClearSelected()
              } else {
                that.$message.warning(res.message)
              }
            })
          },
        })
      }
    },
    //   onSearch (value) {
    //     let that = this
    //     if (value) {
    // searchByKeywords({ keyWord: value }).then(res => {
    //       if (res.success) {
    //         that.departTree = []
    //         for (let i = 0; i < res.result.length; i++) {
    //           let temp = res.result[i]
    //           that.departTree.push(temp)
    //         }
    //       } else {
    //         that.$message.warning(res.message)
    //       }
    //     })
    //   } else {
    //     that.loadTree()
    //   }
    // },
    nodeModalOk() {
      this.loadTree()
    },
    nodeModalClose() {},
    hide() {
      console.log(111)
      this.visible = false
    },
    onCheck(checkedKeys, info) {
      console.log('onCheck', checkedKeys, info)
      this.hiding = false
      //this.checkedKeys = checkedKeys.checked
      // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
      if (this.checkStrictly) {
        this.checkedKeys = checkedKeys.checked
      } else {
        this.checkedKeys = checkedKeys
      }
      // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
    },
    onSelect(selectedKeys, e) {
      console.log('selected', selectedKeys, e)
      this.hiding = false
      let record = e.node.dataRef
      console.log('onSelect-record', record)
      this.currSelected = Object.assign({}, record)
      this.model = this.currSelected
      this.selectedKeys = [record.key]
      this.model.parentId = record.parentId
      this.setValuesToForm(record)
    },
    // 触发onSelect事件时,为区域树右侧的form表单赋值
    setValuesToForm(record) {
      if (record.orgCategory == '1') {
        this.orgCategoryDisabled = true
      } else {
        this.orgCategoryDisabled = false
      }
      this.$nextTick(() => {
        this.form.getFieldDecorator('fax', { initialValue: '' })
        this.form.setFieldsValue(
          pick(
            record,
            'departName',
            'orgCode',
            'centerPosition',
            'areaPosition',
            'departOrder',
            'description',
            'memo',
            'lng',
            'lat'
          )
        )
      })
    },
    getCurrSelectedTitle() {
      return !this.currSelected.title ? '' : this.currSelected.title
    },
    onClearSelected() {
      this.hiding = true
      this.checkedKeys = []
      this.currSelected = {}
      this.form.resetFields()
      this.selectedKeys = []
    },
    handleNodeTypeChange(val) {
      this.currSelected.nodeType = val
    },
    notifyTriggerTypeChange(value) {
      this.currSelected.notifyTriggerType = value
    },
    receiptTriggerTypeChange(value) {
      this.currSelected.receiptTriggerType = value
    },
    submitCurrForm() {
      this.form.validateFields((err, values) => {
        if (!err) {
          if (!this.currSelected.id) {
            this.$message.warning('请点击选择要修改区域!')
            return
          }

          let formData = Object.assign(this.currSelected, values)
          console.log('Received values of form: ', formData)
          httpAction(this.url.edit, formData, 'put').then((res) => {
            if (res.success) {
              this.$message.success('保存成功!')
              this.loadTree()
            } else {
              this.$message.error(res.message)
            }
          })
        }
      })
    },
    emptyCurrForm() {
      this.form.resetFields()
    },
    nodeSettingFormSubmit() {
      this.form.validateFields((err, values) => {
        if (!err) {
          console.log('Received values of form: ', values)
        }
      })
    },
    openSelect() {
      this.$refs.sysDirectiveModal.show()
    },
    handleAdd(num) {
      if (num == 1) {
        this.$refs.departModal.add()
        this.$refs.departModal.title = '添加下级'
      } else if (num == 2) {
        let key = this.currSelected.key
        if (!key) {
          this.$message.warning('请先点击选中上级区域！')
          return false
        }
        // this.$refs.departModal.add(this.selectedKeys)
        this.$refs.departModal.add({ key: this.selectedKeys[0] })
        this.$refs.departModal.title = '添加下级'
      } else {
        this.$refs.departModal.add({ key: this.rightClickSelectedKey, orgType: this.rightClickSelectedOrgType })
        this.$refs.departModal.title = '添加下级'
      }
    },
    handleDelete() {
      var that = this
      this.$confirm({
        title: '确认删除',
        content: '确定要删除此区域以及子节点数据吗?',
        onOk: function () {
          deleteByDepartId({ id: that.rightClickSelectedKey }).then((resp) => {
            if (resp.success) {
              //删除成功后，去除已选中中的数据
              that.checkedKeys.splice(
                that.checkedKeys.findIndex((key) => key === that.rightClickSelectedKey),
                1
              )
              that.$message.success('删除成功!')
              that.loadTree()
              //删除后同步清空右侧基本信息内容
              let orgCode = that.form.getFieldValue('orgCode')
              if (orgCode && orgCode === that.rightClickSelectedOrgCode) {
                that.onClearSelected()
              }
            } else {
              that.$message.warning('删除失败!')
            }
          })
        },
      })
    },
    selectDirectiveOk(record) {
      console.log('选中指令数据', record)
      this.nodeSettingForm.setFieldsValue({ directiveCode: record.directiveCode })
      this.currSelected.sysCode = record.sysCode
    },
    getFlowGraphData(node) {
      this.graphDatasource.nodes.push({
        id: node.id,
        text: node.flowNodeName,
      })
      if (node.children.length > 0) {
        for (let a = 0; a < node.children.length; a++) {
          let temp = node.children[a]
          this.graphDatasource.edges.push({
            source: node.id,
            target: temp.id,
          })
          this.getFlowGraphData(temp)
        }
      }
    },
    // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
    expandAll() {
      this.iExpandedKeys = this.allTreeKeys
    },
    closeAll() {
      this.iExpandedKeys = []
    },
    checkALL() {
      this.checkStriccheckStrictlytly = false
      this.checkedKeys = this.allTreeKeys
    },
    cancelCheckALL() {
      //this.checkedKeys = this.defaultCheckedKeys
      this.checkedKeys = []
    },
    switchCheckStrictly(v) {
      if (v == 1) {
        this.checkStrictly = false
      } else if (v == 2) {
        this.checkStrictly = true
      }
    },
    getAllKeys(node) {
      // console.log('node',node);
      this.allTreeKeys.push(node.key)
      if (node.children && node.children.length > 0) {
        for (let a = 0; a < node.children.length; a++) {
          this.getAllKeys(node.children[a])
        }
      }
    },
    showMap() {
      this.isShowMap = true
    },
    getLatLong(value) {
      this.form.setFieldsValue({
        lng: value[0],
        lat: value[1],
      })
    },
    getBorder(value) {
      this.form.setFieldsValue({
        areaPosition: value,
      })
    },
    createBorderLine() {
      this.$refs.aMap.borderLine = true
      this.isShowMap = true
    },
    // <!---- author:os_chengtgen -- date:20190827 --  for:切换父子勾选模式 =======------>
  },
  created() {
    this.currFlowId = this.$route.params.id
    this.currFlowName = this.$route.params.name
    // this.loadTree()
  },
}
</script>
<style lang="less" scoped>
.ant-card {
  background: transparent;
  border: 1px solid #104c8c;
}

.ant-card-body .table-operator {
  margin: 15px;
}

.anty-form-btn {
  width: 100%;
  text-align: center;
}

.anty-form-btn button {
  margin: 0 5px;
}

.anty-node-layout .ant-layout-header {
  padding-right: 0;
}

.header {
  padding: 0 8px;
}

.header button {
  margin: 0 3px;
}

.ant-modal-cust-warp {
  height: 100%;
}

.ant-modal-cust-warp .ant-modal-body {
  height: calc(100% - 110px) !important;
  overflow-y: auto;
}

.ant-modal-cust-warp .ant-modal-content {
  height: 90% !important;
  overflow-y: hidden;
}

#app .desktop {
  height: auto !important;
}

/** Button按钮间距 */
.ant-btn {
  margin-left: 3px;
}

.drawer-bootom-button {
  position: absolute;
  bottom: 0;
  width: calc(100% - 10px);
  // border: 1px solid #027b8d;
  padding: 10px 16px;
  text-align: left;
  left: 5px;
  // background: @bg;
  border-radius: 0 0 2px 2px;
}
</style>
<style lang="less">
.depart-list {
  width: 100%;
  height: 100%;
  .departlist {
    width: 100%;
    height: 100%;
    background: var(--theme-content-bg);
    overflow: hidden;
  }
  .select-map-img {
    position: absolute;
    right: 0;
    width: 28px;
    top: 50%;
    transform: translateY(-50%);
    cursor: pointer;
  }
  .listContent-wrapper .l-w_content {
    margin-left: 0;
  }
}
.drawer-bootom-button {
  // background: #e3e3e3;
  // border-top: 1px solid #e3e3e3;
}
.tree-x {
  max-height: 600px;
  overflow: auto;
  padding-bottom: 50px;
  /deep/.ant-tree li .ant-tree-node-content-wrapper {
    font-family: SourceHanSansCN-Regular;
    font-size: 16px;
    letter-spacing: 2px;
    color: #ffffff;
  }
  /deep/ .ant-tree li span.ant-tree-switcher {
    color: #fff;
  }
  /deep/ .ant-tree {
    & li .ant-tree-node-content-wrapper.ant-tree-node-selected,
    li .ant-tree-node-content-wrapper:hover {
      background-image: linear-gradient(90deg, rgba(82, 255, 255, 0.84) 0%, rgba(24, 128, 233, 0.84) 100%),
        linear-gradient(#f7f6f6, #f7f6f6);
      color: #000000;
    }
  }
  .ant-tree-checkbox-checked .ant-tree-checkbox-inner {
    background-color: #07a9bf;
    border-color: #07a9bf;
  }
}
// .depart-list .ant-select-selection--single,
// .depart-list .ant-select-selection--single:hover {
//   background: transparent;
//   border: 1px solid #096370;
//   color: #04dce8;
// }
// .depart-list .departlist .right-form-wrapper .ant-select-selection .ant-select-selection__rendered {
//   background: transparent !important;
//   border-right: 1px solid #096370;
// }
// .area-right-padding {
//   input {
//     padding-right: 30px;
//   }
// }
</style>
